package com.ftg.learn.framework.sm.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 切面类
 *
 * @author 布衣
 */
@Aspect
@Component
@EnableAspectJAutoProxy
public class AspectAoop {

//    Before 通知 前置通知

    //切点 :  代理类当中的方法 ,用来完成对目标类的切开操作
    @Before("execution(public * com.ftg.learn.framework.sm.mapper.*.*(..))")
    public void methodBefore(){
        System.out.println("我在你执行之前要执行...");
    }
    @Before("execution(public * com.ftg.learn.framework.sm.service.*.*(..))")
    public void methodBefore1(){
        System.out.println("我是service.我在你执行之前要执行...");
    }

    @Around("execution(public * com.ftg.learn.framework.sm.mapper.*.*(..))")
    public Object test1(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature signature = (MethodSignature)pjp.getSignature();

        System.out.println("之前");
        System.out.println("目标类的信息是==>"+pjp.getTarget().getClass().getName());
        System.out.println("目标类的方法信息==>"+signature.getMethod().getName());
        System.out.println("目标类的方法参数==>"+ Arrays.toString(pjp.getArgs()));
        Object proceed = pjp.proceed();
        System.out.println("之后");
        return proceed;
    }

    // a : spring + mybatis 整合流程  --
    // b : aop : 理论
    //     aop 实践,service - mapper
    // springboot :
    // spring : ioc  aop 工作流程 、 类加载顺序
}
